package com.bdzl.biz.service;

import com.bdzl.pub.entity.flow.ActNodeNextDO;
import com.bdzl.pub.entity.loan.OrderCallDO;
import com.bdzl.pub.entity.loan.OrderDO;
import com.bdzl.pub.entity.loan.OrderRelDO;
import com.bdzl.pub.entity.sys.UserDO;
import com.bdzl.pub.util.param.R;
import com.bdzl.pub.vo.data.UserInfoVO;
import com.bdzl.pub.vo.loan.ContractOnlineSignrecVO;
import com.bdzl.pub.vo.loan.OrderVO;
import com.bdzl.pub.vo.loan.PaymentVO;
import org.springframework.web.bind.annotation.RequestBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 融资租赁订单表
 *
 * @author yangyicai
 * @email yangyicai@foxmail.com
 * @date 2021-05-11 15:23:42
 */
public interface OrderService {

	OrderDO get(String odrNo);

	List<OrderDO> list(Map<String, Object> map);

	int count(Map<String, Object> map);

	int save(OrderDO order);

	int update(OrderDO order);

	int remove(String odrNo);

	int batchRemove(String[] odrNos);
	/**
	 * @Description: TODO 进行校验，并报件
	 * @param userInfoVOs
	 * @return: com.bdzl.pub.util.param.R
	 * @Author: Ming
	 * @Date: 2021/5/17 11:04
	 */
	R newspaper(UserInfoVO[] userInfoVOs,Integer userId);
	/**
	* @Description: TODO 待处理审核列表
	* @param map
	* @return: java.util.List<com.bdzl.pub.vo.loan.OrderVO>
	* @Author: Ming
	* @Date: 2021/5/19 11:01
	*/
	List<OrderVO> checkList(Map<String,Object> map);

	/**
	 * @Description: TODO 已处理列表
	 * @param map
	 * @return: java.util.List<com.bdzl.pub.vo.loan.OrderVO>
	 * @Author: Ming
	 * @Date: 2021/5/19 11:01
	 */
	List<OrderVO> processedList(Map<String, Object> map);
	/**
	* @Description: TODO 我的报件
	* @param map
	* @return: java.util.List<com.bdzl.pub.vo.loan.OrderVO>
	* @Author: Ming
	* @Date: 2021/5/19 11:54
	*/
	List<OrderVO> newsletterList(Map<String, Object> map);

	/**
	 * @Description: TODO 补充资料
	 * @param odrNo 订单号
	 * @return: com.bdzl.pub.vo.loan.OrderVO
	 * @Author: Ming
	 * @Date: 2021/5/19 19:59
	 */
	OrderVO additionalMaterials(String odrNo);

	/**
	* @Description: TODO 根据身份证号查询申请人信息
	* @param conCardId 身份证号
	* @return: com.bdzl.pub.vo.data.UserInfoVO
	* @Author: Ming
	* @Date: 2021/5/19 20:23
	*/
	UserInfoVO applicant(String conCardId);
	/**
	 * @Description: TODO 保存申请人信息
	 * @param userInfoVO 申请人信息
	 * @return: com.bdzl.pub.util.param.R
	 * @Author: Ming
	 * @Date: 2021/5/19 20:23
	 */
	R saveApplicant(UserInfoVO userInfoVO, UserDO userDO);
	/**
	 * @Description: TODO 根据订单号查询挂靠单位
	 * @param odrNo 订单号
	 * @return: com.bdzl.pub.util.param.R
	 * @Author: Ming
	 * @Date: 2021/5/19 20:23
	 */
	OrderCallDO callCompany(String odrNo);
	/**
	* @Description: TODO 获取当前登录用户数据
	* @param request
	* @return: com.bdzl.pub.entity.sys.UserDO
	* @Author: Ming
	* @Date: 2021/5/20 15:36
	*/
	UserDO getUserInfo(HttpServletRequest request);
	/**
	 * @Description: TODO 根据客户id查询实际用车人
	 * @param custCardId 客户id
	 * @return: com.bdzl.pub.util.param.R
	 * @Author: Ming
	 * @Date: 2021/5/19 20:23
	 */
	UserInfoVO actualUser(String custCardId,String odrNo);
	/**
	 * @Description: TODO 申请人id
	 * @param relCustUser 客户id
	 * @param relOdrNo 订单编号
	 * @param relType 关系人类型：Guarantee：担保人 Contact：联系人
	 * @return: com.bdzl.pub.util.param.R
	 * @Author: Ming
	 * @Date: 2021/5/19 20:23
	 */
	List<OrderRelDO> contactPerson(String relOdrNo,Integer relCustUser,String relType);
	/**
	 * @Description: TODO 添加联系人
	 * @param orderRelDO 联系人数据
	 * @return: com.bdzl.pub.util.param.R
	 * @Author: Ming
	 * @Date: 2021/5/19 20:23
	 */
	void saveContactPerson(@RequestBody OrderRelDO orderRelDO);
	/**
	 * @Description: TODO 添加实际用车人
	 * @param userInfoVO 客户信息
	 * @return: com.bdzl.pub.util.param.R
	 * @Author: Ming
	 * @Date: 2021/5/19 20:23
	 */
	R saveActualUser( UserInfoVO userInfoVO,UserDO userDO);
	/**
	 * @Description: TODO 查询担保人
	 * @param relCustUser 申请人id
	 * @param relOdrNo 订单编号
	 * @return: com.bdzl.pub.util.param.R
	 * @Author: Ming
	 * @Date: 2021/5/19 20:23
	 */
	List<UserInfoVO> guarantor(String relOdrNo,Integer relCustUser);

	/**
	 * @Description: TODO 计算公式
	 * @param order 申请单
	 * @return: com.bdzl.pub.util.param.R
	 * @Author: Ming
	 * @Date: 2021/5/22 11:07
	 */
	R calculationFormula(OrderVO order);
	/**
	 * @Description: TODO 复审数据
	 * @param
	 * @return: com.bdzl.pub.util.param.R
	 * @Author: Ming
	 * @Date: 2021/5/25 10:24
	 */
	OrderVO review(String odrNo);

	/**
	 * 下载协议书
	 * @return
	 */
	void downloadAgreement(String poId, HttpServletResponse response, HttpServletRequest request,String temType) throws IOException;

	/**
	 * @Author Zhn
	 * @Description //TODO 回款确认列表
	 * @Date 15:45 2021/5/28
	 * @Param [单号，姓名]
	 * @return com.bdzl.pub.entity.sys.OrgDO
	 **/
	List<PaymentVO> paymentList(Map<String,Object> map);
	/**
	* @Description: TODO 查询电子授权书
	* @param odrNo  订单号
	* @param signer 客户姓名
	* @return: boolean
	* @Author: Ming
	* @Date: 2021/5/28 14:19
	*/
	ContractOnlineSignrecVO getContractByUser(String odrNo, String signer);

	/**
	* @Description: TODO 根据当前节点和下一步节点获取中间状态值
	* @param nowId 当前节点id
	* @param nextId  下一步节点id
	* @return: com.bdzl.pub.entity.flow.ActNodeNextDO
	* @Author: Ming
	* @Date: 2021/5/28 15:40
	*/
	ActNodeNextDO getByNowAndNext(Integer nowId,Integer nextId);


	/**
	 * todo 订单统计
	 */

	public List<OrderVO> statisticsOrderList(Map map);

	public Integer statisticsOrderListcount(Map map);
	/**
	* @Description: TODO 根据登录用户id 查询角色id
	* @param userId 登录用户id
	* @return: java.util.List<java.lang.String>
	* @Author: Ming
	* @Date: 2021/5/29 13:36
	*/
	List<String> getRoleByUserId(Integer userId);
	/**
	* @Description: TODO 根据角色id查询可以操作的所有订单状态
	* @param roleIds 角色id
	* @return: java.util.List<java.lang.String>
	* @Author: Ming
	* @Date: 2021/5/29 14:46
	*/
	List<String> getStatValByRole(List<String> roleIds);
	/**
	 * 订单统计页面
	 * @param map
	 * @return{
	 * 融资总额，sumOdrLoanSys
	 * 放款总额，sumodrPayMoney
	 * 订单数量，orderCount}
	 */
	Map<String, String> statisticsOrderCount(Map map);

	/**
	 *订单统计，订单总额
	 * @param map
	 * @return {
	 * 融资总额，sumOdrLoanSys
	 * 返佣总额，sumOdrReturnMoney
	 * 奖励总额，sumOdrBonusMoney
	 * 打款总额，sumOdrPayMoney
	 * 利润总额，sumOdrProfitMoney
	 * 平均毛利率，avgOdrGrossRate }
	 */
	Map<String,String> statisticsOrderSumPrice(Map map);

	/**
	 * @Author Zhn
	 * @Description //TODO 获取打款金额
	 * @Date 11:43 2021/5/29
	 * @Param [month,today] 传month = 任意值 获取当前月  传today = 任意值 获取当前日    禁止同时传值
	 * @return com.bdzl.pub.vo.loan.OrderVO
	 **/
	BigDecimal sumOdrPayMoney(Map<String,Object> map);

	/**
	 * @Author Zhn
	 * @Description //TODO 获取融资金额
	 * @Date 11:43 2021/5/29
	 * @Param [month,today] 传month = 任意值 获取当前月  传today = 任意值 获取当前日    禁止同时传值
	 * @return com.bdzl.pub.vo.loan.OrderVO
	 **/
	BigDecimal sumOdrLoanSys(Map<String,Object> map);
}
